// 顺序栈的表示
#define MAXSIZE 100
typedef struct
{
    SElemType *base;
    SElemType *top;
    int stacksize;
} SqStack;

// 顺序栈的初始化
Status InitStack(SqStack &S)
{ // 构造一个空栈
    S.base = (SElemType *)malloc(MAXSIZE * (sizeof(SElemType)));
    if (!S.base)
        exit(OVERFLOW); // exit()--程序的终止和状态返回
    S.top = S.base;
    S.stacksize = MAXSIZE;
    return OK;
}

// 判断顺序栈是否为空
Status StackEmpty(SqStack S)
{
    if (S.top == S.base)
        return TRUE;
    else
        return FALSE;
}

// 求顺序栈长度
int StackLength(SqStack S)
{
    return S.top - S.base;
}

// 清空顺序栈
Status ClearStack(SqStack S)
{
    if (S.base)
        S.top = S.base;
    return OK;
}

// 销毁顺序栈
Status DestroyStack(SqStack &S)
{
    if (S.base)
    {
        free(S.base);
        S.stacksize = 0;
        S.base = S.top = NULL;
    }
    return OK;
}

// 入栈
Status Push(SqStack &S, SElemType e)
{
    if (S.top - S.base == S.stacksize)
        return ERROR;
    *S.top++ = e; // 先元素e压入栈顶（解引用），再top指针加1
    return OK;
}

// 出栈
Status Pop(SqStack &S,SElemType &e){
    if (S.top == S.base) return ERROR;
    e = *--S.top;// 先top指针下移找到对应元素，然后再用e返回其值
    return OK;
}